# -*- coding: utf-8 -*-
"""
Kafka配置管理API视图

该模块提供Kafka配置的CRUD操作接口，包括：
1. 保存Kafka配置（创建/更新）
2. 获取单个Kafka配置
3. 获取所有Kafka配置列表
4. 删除Kafka配置
5. 发送消息到Kafka

所有接口返回统一的JSON格式：
{
    "code": 0/1,  // 0表示成功，1表示失败
    "message": "操作结果描述",
    "data": {}  // 返回的数据（可选）
}
"""

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
import json
import logging
from .models import KafkaConfig, KKeyMap, KKeyDisplay
from django.db import connections

# 配置日志记录器
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@csrf_exempt
def save_kafka_config(request):
    """
    保存Kafka配置的接口
    
    入参:
    - name: 配置名称
    - url: Kafka服务器地址
    - topic: 主题名称
    - json: (可选) JSON数据
    - id: (可选) 配置ID，用于更新现有配置
    
    出参:
    - code: 成功0，失败1
    - message: 返回消息
    - data: 返回数据，包含保存的配置ID
    """
    if request.method != 'POST':
        return JsonResponse({
            'code': 1,
            'message': '仅支持POST请求'
        })
    
    try:
        # 解析请求体JSON数据
        data = json.loads(request.body)
        name = data.get('name')
        url = data.get('url')
        topic = data.get('topic')
        json_data = data.get('json')
        config_id = data.get('id')
        
        # 校验必填参数
        if not name or not url or not topic:
            return JsonResponse({
                'code': 1,
                'message': '缺少必要参数：name, url, topic'
            })
        
        # 如果提供了ID，则更新现有配置，否则创建新配置
        if config_id:
            try:
                # 尝试获取现有配置
                config = KafkaConfig.objects.get(id=config_id)
                config.name = name
                config.url = url
                config.topic = topic
                config.json = json_data
                config.save()
                logger.info(f"Kafka配置更新成功: id={config.id}, name={name}")
                message = 'Kafka配置更新成功'
            except KafkaConfig.DoesNotExist:
                return JsonResponse({
                    'code': 1,
                    'message': f'未找到ID为{config_id}的配置'
                })
        else:
            # 创建新配置
            config = KafkaConfig.objects.create(
                name=name,
                url=url,
                topic=topic,
                json=json_data
            )
            logger.info(f"Kafka配置创建成功: id={config.id}, name={name}")
            message = 'Kafka配置创建成功'
        
        return JsonResponse({
            'code': 0,
            'message': message,
            'data': {
                'id': config.id,
                'name': config.name,
                'url': config.url,
                'topic': config.topic,
                'json': config.json
            }
        })
    
    except Exception as e:
        logger.error(f"保存Kafka配置时发生错误: {str(e)}")
        return JsonResponse({
            'code': 1,
            'message': f'发生错误: {str(e)}'
        })

@csrf_exempt
def get_kafka_config(request):
    """
    获取单个Kafka配置的接口
    
    入参:
    - id: 配置ID
    
    出参:
    - code: 成功0，失败1
    - message: 返回消息
    - data: 返回的配置数据
    """
    try:
        config_id = request.GET.get('id')
        
        if not config_id:
            return JsonResponse({
                'code': 1,
                'message': '缺少必要参数：id'
            })
        
        try:
            config = KafkaConfig.objects.get(id=config_id)
            return JsonResponse({
                'code': 0,
                'message': '获取成功',
                'data': {
                    'id': config.id,
                    'name': config.name,
                    'url': config.url,
                    'topic': config.topic,
                    'json': config.json
                }
            })
        except KafkaConfig.DoesNotExist:
            return JsonResponse({
                'code': 1,
                'message': f'未找到ID为{config_id}的配置'
            })
    
    except Exception as e:
        logger.error(f"获取Kafka配置时发生错误: {str(e)}")
        return JsonResponse({
            'code': 1,
            'message': f'发生错误: {str(e)}'
        })

@csrf_exempt
def list_kafka_configs(request):
    """
    获取所有Kafka配置的接口
    
    出参:
    - code: 成功0，失败1
    - message: 返回消息
    - data: 返回的配置数据列表
    """
    try:
        configs = KafkaConfig.objects.all()
        config_list = []
        
        for config in configs:
            config_list.append({
                'id': config.id,
                'name': config.name,
                'url': config.url,
                'topic': config.topic,
                'json': config.json
            })
        
        return JsonResponse({
            'code': 0,
            'message': '获取成功',
            'data': config_list
        })
    
    except Exception as e:
        logger.error(f"获取Kafka配置列表时发生错误: {str(e)}")
        return JsonResponse({
            'code': 1,
            'message': f'发生错误: {str(e)}'
        })

@csrf_exempt
def delete_kafka_config(request):
    """
    删除Kafka配置的接口
    
    入参:
    - id: 配置ID
    
    出参:
    - code: 成功0，失败1
    - message: 返回消息
    """
    if request.method != 'POST':
        return JsonResponse({
            'code': 1,
            'message': '仅支持POST请求'
        })
    
    try:
        # 解析请求体JSON数据
        data = json.loads(request.body)
        config_id = data.get('id')
        
        if not config_id:
            return JsonResponse({
                'code': 1,
                'message': '缺少必要参数：id'
            })
        
        try:
            config = KafkaConfig.objects.get(id=config_id)
            config_name = config.name
            config.delete()
            logger.info(f"Kafka配置删除成功: id={config_id}, name={config_name}")
            
            return JsonResponse({
                'code': 0,
                'message': 'Kafka配置删除成功'
            })
        except KafkaConfig.DoesNotExist:
            return JsonResponse({
                'code': 1,
                'message': f'未找到ID为{config_id}的配置'
            })
    
    except Exception as e:
        logger.error(f"删除Kafka配置时发生错误: {str(e)}")
        return JsonResponse({
            'code': 1,
            'message': f'发生错误: {str(e)}'
        })

@csrf_exempt
@require_http_methods(["GET"])
def list_key_map(request):
    """
    获取key映射列表
    从MySQL数据库的k_key_map表获取数据
    """
    try:
        # 使用Django ORM查询MySQL数据库
        key_maps = KKeyMap.objects.all().order_by('id')
        key_map_list = []
        for key_map in key_maps:
            key_map_list.append({
                'id': key_map.id,
                'name': key_map.name,
                'key': key_map.key,
                'value': key_map.value
            })
            
        logger.info(f"从MySQL获取到{len(key_map_list)}条key映射记录")
        
        return JsonResponse({
            'code': 0,
            'message': '获取key映射列表成功',
            'data': key_map_list
        })
                
    except Exception as e:
        logger.error(f"获取key映射列表失败: {str(e)}")
        return JsonResponse({
            'code': 1,
            'message': f'获取key映射列表失败: {str(e)}'
        })

@csrf_exempt
@require_http_methods(["GET"])
def list_key_display(request):
    """
    获取字段显示配置列表
    根据config_id参数获取对应的字段显示配置
    
    入参:
    - config_id: (可选) 配置ID，如果不提供则返回所有配置
    
    出参:
    - code: 成功0，失败1
    - message: 返回消息
    - data: 返回的配置数据列表
    """
    try:
        config_id = request.GET.get('config_id')
        
        # 构建查询条件
        if config_id:
            key_displays = KKeyDisplay.objects.filter(config_id=config_id).order_by('id')
        else:
            key_displays = KKeyDisplay.objects.all().order_by('id')
        
        key_display_list = []
        for key_display in key_displays:
            # 解析sub字段的JSON数据
            sub_data = None
            if key_display.sub:
                try:
                    sub_data = json.loads(key_display.sub)
                except json.JSONDecodeError:
                    logger.warning(f"字段显示配置ID {key_display.id} 的sub字段JSON格式错误")
                    sub_data = {}
            
            key_display_list.append({
                'id': key_display.id,
                'config_id': key_display.config_id,
                'key': key_display.key,
                'name': key_display.name,
                'sub': sub_data
            })
        
        logger.info(f"获取到{len(key_display_list)}条字段显示配置记录")
        
        return JsonResponse({
            'code': 0,
            'message': '获取字段显示配置列表成功',
            'data': key_display_list
        })
        
    except Exception as e:
        logger.error(f"获取字段显示配置列表失败: {str(e)}")
        return JsonResponse({
            'code': 1,
            'message': f'获取字段显示配置列表失败: {str(e)}'
        })